/*
 * AESTools.h
 *
 *   Created on: 2010-3-27     
 *  Description: 
 *    Copyright: 2010 @ ICT Li Heyuan
 */

#ifndef AESTOOLS_H_
#define AESTOOLS_H_

#include <string>
using std::string;

#include <cryptopp/aes.h>
#include <cryptopp/modes.h>
#include <cryptopp/osrng.h>
using namespace CryptoPP;

/* AES加密辅助类
 * 密钥长度为128/192/256位，即16/24/32字节
 * 区块为128位
 */
class AESTools
{
public:
	//用于加密，指定16/24/32的key,iv随机
	AESTools(const string &key);
	//默认构造函数，什么也不初始化
	AESTools();
	//用于解密，指定16/24/32的key,iv指定
	AESTools(const string &key, const string &iv);

	//复制构造函数
	AESTools& operator =(const AESTools &right);

	virtual ~AESTools();

	//使用AES将plain加密成byte[]，然后转化为Base64编码，便于网络传输
	string encryptWithBase64(const string &plain);
	//先Base64解码，然后AES解密
	string decryptWithBase64(const string &cipher_b64);

	//获取base64编码的iv
	string getIV();

	//获取base64编码的key
	string getKey();

private:
	//AES加密成byte[]，回写到plain中
	void encrypt(char *plain, unsigned int len);
	//AES解密成byte[]，回写到cipher中
	void decrypt(char *cipher, unsigned int len);

private:
	//随机生成器
	AutoSeededRandomPool _rnd;

	//随机向量
	byte _iv[AES::BLOCKSIZE];

	//密钥长度
	unsigned int _key_len;

	//对称密钥，最大32bytes
	byte _key[32];
};

#endif /* AESTOOLS_H_ */
